/* ****************************************************************************
 * 				main.cpp
 * 
 * A sample program used to demonstrate the functionality of the library. 
 * 
 * Author: Nedim Srndic
 * Release date: 14th of March 2008
 * 
 * TODO: add code to demonstrate basic functionality 
 * of RSA. 
 * 
 * ****************************************************************************
 */

#include <cstdlib>
#include <iostream>
#include "RSA.h"
#include "BigInt.h"
#include "PrimeGenerator.h"
#include "test.h"

using std::cout;
using std::endl;

int main(int argc, char *argv[])
{
	try
	{
		/*CONSTRUCTOR, DESTRUCTOR, ASSIGNMENT AND STREAM OUTPUT OPERATOR TEST*/
//		TestBigIntFunctions();
		/*				ARITHMETIC AND COMPARISON OPERATOR TEST	*/
//		TestBigIntOperators();
		/*				FACTORIAL COMPUTATION BENCHMARK			*/
//		FactorialBenchmark();
		/*				RANDOM TEST GENERATOR					*/
//		RandomBigIntTest(10);
		/*				RANDOM DIVISION TEST GENERATOR			*/
//		RandomBigIntDivisionTest(10);
		/*				PRIME GENERATOR TEST					*/
//		TestPrimeGenerator(2);
		/*				KEY GENERATOR TEST						*/
		TestKeyGeneration(3);

//		BigInt fact(BigIntOne);
//		for (BigInt i(BigIntOne); i <= 1000; i++)
//			fact = fact * i;
			
//		cout << fact << endl << endl;
//		BigInt a = "12345456436242343274634672367462374627364723674623746563547623542374623746236412345456436242343274634672367462374627364723674623746563547623542374623746236423546236452345726354623546253465236453276453754232342359823745928374592837456293874562935623945623945629356239456293562938562938745629356293562395629356293748562938745629384756293856298374528937569238562938529837459283745923745293784298734629837492837569238745629385623956576253645376427635462536452367452736546273546235472342342342343243243242623546753645276354726354623576452763672354623423423432432423432453234324234232354623645234572635462354625346523645327645375423234235982374592837459283745629387456293562394562394562935623945629356293856293874562935629356239562935629374856293874562938475629385629837452893756923856293852983745928374592374529378429873462983749283756923874562938562394243242454";
//  		BigInt b = "123454564362423432746346723674623746273647236746237465635476235423746237462364235462364523457263546235462534652364532764537542323423598237459283745928374562938745629356239456239456293562394562935629385629387456293562935623956293562937485629387456293847562938562983745289375692385629385298374592837459237452937842987346298374928375692387456293856239565762536453764276354625364523674527365462735462354723423423423432432432426235467536452763547263546235764527636723546234234234324324234324532343242342364723674623746563547623542374623746236412345456436242343274634672367462374627364723674623746563547623542374623746236423546236452345726354623546253465236453276453754232342359823745928374592837456293874562935623945623945629356239456293562938562938745629356293562395629356293748562938745629384756293856298374528937569238562938529837459283745923745293784298734629837492837569238745629385623956";
//  		cout << a * b;
  
		pauseScreen();
	}
	catch (const char errorMessage[])
	{
		cout << errorMessage;
		pauseScreen();
		return EXIT_FAILURE;
	}
	catch (...)
	{
		cout << "Unknown error." << endl;
		pauseScreen();
		return EXIT_FAILURE;
	}

    return EXIT_SUCCESS;
}
